package com.zwh.se.constant_variable_operator;

/**
 * Java的数据类型可分为两大类：基本数据类型（primitive data type）和引用数据类型（reference data type）。
 * 八大基本数据类型：指的是Java的原始类型(Primitive Data Type)。
 * 引用数据类型：基本数据类型以外的都是引用数据类型,比如类、接口、数组之类的
 *
 * @author yexi
 */
public class DataType {
    public static void main(String[] args) {
        System.out.println("----------1、整数类型:byte、short、int、long----------");

        //byte类型:占位1字节,只能表示-128到127
        System.out.println("byte类型占位" + Byte.BYTES + "字节,可表示范围" + Byte.MIN_VALUE + "至" + Byte.MAX_VALUE);
        byte byteNum = -1;
        //编译错误的例子:
        //byteNum = 128;
        //byteNum = -129;

        //short类型:占位2字节,能表示-2^15到2^15-1
        System.out.println("short类型占位" + Short.BYTES + "字节,可表示范围" + Short.MIN_VALUE + "至" + Short.MAX_VALUE);
        short shortNum = -32768;
        shortNum = 32767;

        //int类型:占位4字节,整数类型默认都是int类型
        int intNum = 234324112;
        System.out.println("int类型占位" + Integer.BYTES + "字节,可表示范围" + Integer.MIN_VALUE + "至" + Integer.MAX_VALUE);

        //long类型:long的表示是方式为L/l,占位8字节,64位二进制
        //编译失败,报错Integer number too large,意味着确实整数常量默认就是int类型
        //long longNum = 12345678910;
        //long类型需要使用L/l加以修饰,且一般而言,使用L更具有可读性,也更建议使用
        long longNum = 12345678910L;
        //注意：只有这个数超出int类型的范围了后面才需要加上L，否则无需加L也可以赋值给long类型：
        longNum = 12;
        System.out.println("long类型占位" + Long.BYTES + "字节,可表示范围" + Long.MIN_VALUE + "至" + Long.MAX_VALUE);

        System.out.println("----------2、浮点数类型:float、double----------");

        //float类型:又被称作单精度类型,尾数可以精确到7位有效数字,在很多情况下,float类型的精度很难满足需求
        //float类型的数值有一个后缀F或者f,没有后缀F/f的浮点数值默认为double类型。
        //float占位4字节,可以精确到6-7位(单精度)
        System.out.println("float类型占位" + Float.BYTES + "字节,可表示范围" + Float.MIN_VALUE + "至" + Float.MAX_VALUE);
        //注意：浮点数类型默认是double类型的，要想将一个double类型的数赋给float类型，必须后面加上F或者f
        float floatNum = 3.14234567898623F;

        //double类型:表示这种类型的数值精度约是float类型的两倍(15-16位),又被称作双精度类型,绝大部分应用程序都采用double类型。
        //可以在浮点数值后添加后缀D或者d,以显式地表示其为double类型。
        System.out.println("double类型占位" + Double.BYTES + "字节,可表示范围" + Double.MIN_VALUE + "至" + Double.MAX_VALUE);
        //注意：double类型后面可以加D或者d，但是一般我们都省略不写
        double doubleNum = 3.14234567898623D;

        //float和double是不精确的,其存在着存在舍入误差
        float f2 = 3.1415926f;
        double f3 = 3.1415926;
        System.out.println(f2);
        System.out.println(f3);
        //注意：我们最好不要进行浮点类型的比较(这是由于浮点数底层存储形式的问题,我们所看到的数与其在计算机底层所存储的并不一样)
        System.out.println(0.3F == 0.3);
        System.out.println(0.01F == 1.0F / 100);

        System.out.println("----------3、布尔类型:boolean----------");
        //boolean类型有两个常量值,true和false,在内存中占一位(不是一个字节),不可以使用 0 或非 0 的整数替代 true 和 false,这点和C语言不同。
        //boolean 类型用来判断逻辑条件，一般用于程序流程控制 。
        boolean flag = true;

        System.out.println("----------4、字符类型:char----------");
        //char类型:用单引号（'')引起来的一个字符,只能存储一个字符,char类型在内存中占2个字节。
        //char类型用来表示在Unicode编码表中的字符。Unicode编码被设计用来处理各种语言的文字,可允许有65536个字符。
        System.out.println("char类型占位" + Character.BYTES + "字节,可表示范围" + Character.MIN_VALUE + "至" + Character.MAX_VALUE);
        //char类型我们看到的样子只是它本身的字面常量,但是如果要将其进行进行计算的时候,实际上是按照ASCII码来进行计算的(因为就是这样存的)。
        //Unicode编码表兼容ASCII表,Unicode的前128位置正是ASCII码
        System.out.println('A' + 90);
        //当然汉字还是老老实实用回Unicode中的数,ASCII毕竟只有字母和符号
        System.out.println('中' - 90);

        System.out.println("----------5、字符串类型:String----------");
        //引用数据类型就不再更多深入,可以去对应的部分再阅读
        //字符串类型:由多个字符连成的串,并使用双引号""括起来,本质是一个"类"。字符串的本质就是字符数组。
        /**
         * @see String#value
         */
        System.out.println("字符串");

    }
}
